const { Service } = require('egg')
const { tableToList } = require('../utils/tools')

/**
 * 根据输入的成绩字符串判断其状态。
 * @param {string} str 表示成绩的字符串，可以是数字或者文字。
 * @return {Array} 返回一个包含两个元素的数组。第一个元素是输入的成绩字符串，第二个元素是成绩的状态，
 *                  如果成绩是数字，则状态为'已获'（及格）或'已开未获'（不及格）；如果成绩是文字，则状态为'已获'（及格）或'已开未获'（不及格）。
 */
const gradeStatus = (str) => {
  if (/^\d+$/.test(str)) { // 如果输入的是数字
    return [str, (Number(str) >= 60) ? '已获' : '已开未获'] // 判断数字是否及格，及格则返回'已获'，否则返回'已开未获'
  }
  return [str, str === '不及格' ? '已开未获' : '已获'] // 如果输入的是文字，判断是否为'不及格'，是则返回'已开未获'，否则返回'已获'
}

module.exports = class CreditService extends Service {
  /**
    * 学分修读情况
    * @return {Array} *
    */
  async table() {
    const Cookie = this.ctx.state.Cookie
    const apiUrl = `${this.ctx.state.baseUrl}/jsxsd/kscj/cjcx_list`
    const res = await this.ctx.curl(apiUrl, {
      method: 'POST',
      data: {
        kksj: '',
        kcxz: '',
        kcmc: '',
        fxkc: '0',
        xsfs: 'all',
      },
      headers: {
        Cookie,
        'Content-Type': 'application/x-www-form-urlencoded',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
      },
      timeout: 10000,
    })
    if (res.status === 200) {
      try {
        const tableList = tableToList(res.data.toString(), '#dataList', '')
        // console.log('tableList', tableList);

        /* 遍历数组，构造数据 */
        const result = []
        const categorySave = []
        for (let i = 1; i < tableList.length; i++) {
          const category = tableList[i][9]
          const index = categorySave.indexOf(category)
          const item = {
            N: tableList[i][3],
            T: tableList[i][1],
            G: tableList[i][4],
            C: tableList[i][5],
            S: gradeStatus(tableList[i][4])[1],
          }
          if (index === -1) {
            result.push({
              category,
              details: [item],
              need: '',
              has: '',
            })
            categorySave.push(category)
          }
          else result[index].details.push(item)
        }

        /* 计算已修读分数 */
        let has = 0
        for (const i of result) {
          for (const j of i.details) {
            if (j.S === '已获') {
              has += Number(j.C)
            }
          }
          i.has = `${has}`
          has = 0
        }
        return result
      } catch (err) {
        console.log(err)
        return []
      }
    }
    return []
  }

  /**
   * * 创新学分、素拓分、第二课堂分
   * @return {Array} *
   */
  async extra() {
    const Cookie = this.ctx.state.Cookie
    const apiUrl = `${this.ctx.state.baseUrl}/jsxsd/pyfa/cxxf_query`
    const res = await this.ctx.curl(apiUrl, {
      method: 'GET',
      headers: {
        Cookie,
        'Content-Type': 'application/x-www-form-urlencoded',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
      },
      timeout: 10000,
    })

    const header = ['学期', '项目名称', '学分', '编号', '类型', '备注'] // 列名称
    if (res.status === 200) {
      try {
        const tableList = tableToList(res.data.toString(), '#dataList')
        /* [ '序号', '学年学期', '项目编号', '学号', '姓名', '学分', '学分类型', '备注' ]; */

        const columnNeed = [1, 3, 6, 2, 7, 8] // 需要提取的列序号
        if (tableList.length === 0 || tableList[1][0] === '未查询到数据') return { table: [], header, has: '0' }

        const table = []
        let has = 0
        for (let i = 1; i < tableList.length; i++) {
          const tem = []
          columnNeed.forEach((idx) => { tem.push(tableList[i][idx]) })
          if (tem[0]) { table.push(tem) }
          has += Number(tem[2])
        }
        return { table, header, has: `${has}` }
      } catch (err) {
        return err
      }
    }
    return { table: [], header, has: '0' }
  }
}
